package com.zyf.chapter02.creation.factory.simple;

import com.zyf.chapter02.creation.factory.util.*;

/**
 * 需求：根据配置文件的后缀（json、xml、yaml、properties），选择不同的解析器（JsonRuleConfigParse...），
 * 将存储在文件中的配置解析成内存对象
 * @author yifeng
 */
public class V1RoleConfigSource {
    public RuleConfig load(String ruleConfigFilePath) throws InvalidRuleConfigException {
        String ruleConfigFileExtension = getFileExtension(ruleConfigFilePath);
        // 重构点：将功能独立的代码块封装成函数，可以将一下代码抽象成 createParser() 函数
        IRuleConfigParser parser = null;
        if ("json".equalsIgnoreCase(ruleConfigFileExtension)) {
            parser = new JsonRuleConfigParser();
        } else if ("xml".equalsIgnoreCase(ruleConfigFileExtension)) {
            parser = new XmlRuleConfigParser();
        } else if ("yaml".equalsIgnoreCase(ruleConfigFileExtension)) {
            parser = new YamlRuleConfigParser();
        }  else if ("properties".equalsIgnoreCase(ruleConfigFileExtension)) {
            parser = new PropertiesRuleConfigParser();
        } else {
            throw new InvalidRuleConfigException("Rule config file format is not supported: " + ruleConfigFilePath);
        }

        String configText = "";
        // 从 ruleConfigFilePath 文件中读取文本到 configText 中
        RuleConfig ruleConfig = parser.parse(configText);
        return ruleConfig;
    }

    private String getFileExtension(String ruleConfigFilePath) {
        // 解析文件获取扩展名，比如 rule.json，返回 json
        return "json";
    }
}
